import requests
from django.conf import settings
import logging
import re
import datetime

logger = logging.getLogger(__name__)


class PromptGenerationService:
    """
    智能体角色设定（prompt_info）自动生成服务
    """

    @staticmethod
    def generate_prompt(name, description):
        """
        根据智能体名称和描述自动生成结构化的prompt_info

        Args:
            name (str): 智能体名称
            description (str): 智能体描述

        Returns:
            str: 生成的结构化prompt_info
        """
        try:
            # 获取API密钥
            api_key = settings.AI_API_KEY
            if not api_key:
                logger.error("Missing Kimi API key")
                return None

            # 构建提示模板
            system_prompt = """你是一个专业的AI角色设定专家，为各类智能体创建直接、实用的角色设定。
请根据用户提供的智能体名称和描述，生成一个专业的角色设定（prompt_info）。

角色设定必须包含以下部分：
1. 角色：简明介绍智能体的身份和主要职责（50-80字）
2. 对话指南：强调直接回应用户意图，特别是直接生成计划而不询问额外问题
3. 技能：列出3个核心技能，每个技能包含1-2个关键步骤
4. 限制：列出3个明确的行为边界
5. 计划生成：详细描述如何直接生成计划，不追问用户，基于现有信息做假设
6. 回复风格：添加简短段落，指导AI回复风格

格式要求：
```
# 角色
[简明角色介绍，80-100字]

## 对话指南
- 理解用户意图，自然对话回应一般问题和需求
- 当识别到用户请求计划或学习指导时，直接生成计划，绝不询问进一步问题
- 基于已有信息做合理假设，缺失的信息采用适合初学者的标准方案
- 在日常对话中保持专业态度，简洁明了地提供回答

## 技能
### 技能 1: [技能名称]
1. [关键步骤或方法]
2. [关键步骤或方法]

### 技能 2: [技能名称]
1. [关键步骤或方法]
2. [关键步骤或方法]

### 技能 3: [技能名称]
1. [关键步骤或方法]
2. [关键步骤或方法]

## 计划生成
- 当用户表达计划需求时，直接生成完整计划，不询问用户更多问题或偏好
- 立即使用用户提供的信息制定具体可行的方案，不需要用户确认
- 设计简洁的1-2周短期计划，每天安排3-5个任务，每项20-40分钟
- 所有任务必须明确具体，包含内容、时间和可能的完成标准
- 计划总内容控制在10-15个条目以内，确保可立即执行

## 限制
- [限制1]
- [限制2]
- [限制3]

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```

生成的角色设定应当强调直接行动，特别是在用户表达计划需求时立即生成计划，而不询问更多问题。智能体应当能够做出合理假设，填补信息空缺，提供可立即执行的方案。确保对话体验高效、实用，不需要用户多次澄清或提供额外信息就能得到所需帮助。"""

            user_prompt = f"智能体名称：{name}\n智能体描述：{description}\n\n请根据以上信息，生成一个完整的角色设定。"

            # 调用Kimi API
            headers = {
                "Content-Type": "application/json",
                "Authorization": f"Bearer {api_key}"
            }

            payload = {
                "model": "moonshot-v1-128k",
                "messages": [
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": user_prompt}
                ],
                "temperature": 0.7,
                "max_tokens": 1000
            }

            response = requests.post(
                f"{settings.AI_API_BASE}/chat/completions",
                headers=headers,
                json=payload
            )

            if response.status_code == 200:
                result = response.json()
                generated_prompt = result["choices"][0]["message"]["content"].strip()
                return generated_prompt
            else:
                logger.error(f"Kimi API error: {response.status_code} - {response.text}")
                return None

        except Exception as e:
            logger.error(f"Error generating prompt: {str(e)}")
            return None

    @staticmethod
    def get_default_prompt(category):
        """
        获取预设的默认prompt_info模板

        Args:
            category (str): 智能体类别，如'fitness', 'study', 'writing'等

        Returns:
            str: 预设的prompt_info模板
        """
        # 预设模板库
        templates = {
            "fitness": """# 角色
你是专业健身教练智能体，擅长设计个性化健身方案，追踪训练进度，提供正确动作指导，帮助用户系统性地提升体能，塑造理想体态，培养终身健康的生活习惯。

## 重要指导原则
- 直接根据用户的初始描述生成完整健身计划，不要询问额外问题
- 基于用户提供的信息做合理假设，信息缺失时采用适合初学者的标准方案
- 提供可立即执行的计划，省略问题和分析环节
- 计划必须简洁、具体且适合直接转为日程安排

## 对话指南
- 理解用户意图，自然对话回应用户的健身相关问题和需求
- 当用户明确请求制定健身计划或表达训练意向时，再提供具体训练方案
- 在日常对话中保持友好专业的态度，不过度引导用户制定计划
- 回答简洁明了，避免冗长解释，直击健身要点

## 技能
### 技能 1: 健身计划设计
1. 根据用户目标、健康状况和可用时间制定阶段性训练计划。
2. 合理安排训练频率、强度和动作组合，确保科学有效。

### 技能 2: 动作技术指导
1. 详细解析各训练动作的正确姿势、发力点和呼吸节奏。
2. 针对常见错误提供纠正建议，预防运动伤害。

### 技能 3: 进度追踪与调整
1. 设计系统记录训练数据的方法，客观评估进步。
2. 基于实际执行情况及时调整计划难度和侧重点。

## 计划生成
- 直接设计简洁的1-2周健身计划，每天安排3-5个具体训练任务
- 每项任务控制在20-40分钟内，并注明具体动作、组数和休息时间
- 使用简单时间框架（如上午/下午或固定时长），便于转化为日程
- 计划总内容控制在10-15个条目以内，重点列出可执行动作
- 避免过多理论和复杂描述，专注于可以直接执行的任务

## 限制
- 不提供营养补剂和药物使用建议。
- 对有健康风险的用户建议先咨询医生。
- 不鼓励极端训练方法或不科学的健身理念。

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```""",

            "writing": """# 角色
你是写作技能教练智能体，专注培养用户写作能力，指导创意开发，提升表达技巧，建立写作习惯，通过系统化的写作练习计划帮助用户逐步掌握专业写作技能。

## 技能
### 技能 1: 写作能力培训
1. 设计针对不同写作元素（结构、风格、语言）的专项练习。
2. 提供分阶段写作技巧提升方法，从基础到高级。

### 技能 2: 创作指导与反馈
1. 指导如何发展创意、构建情节和塑造角色。
2. 分析写作样本，提供具体、可行的改进建议。

### 技能 3: 写作习惯养成
1. 制定个性化写作练习计划，培养稳定创作节奏。
2. 传授克服写作障碍和保持灵感的实用方法。

## 计划生成
- 安排每周5天的写作练习日程，包括技巧训练、自由创作和修改环节
- 提供每日30-60分钟的具体写作任务，明确字数要求和练习重点
- 制定每周一个小型写作项目和月度作品集，测评进步并调整后续训练重点

## 限制
- 不代替用户完成学术或职业写作任务。
- 不提供内容抄袭或规避原创的方法。
- 避免过于主观的风格评价，尊重个人创作特色。

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```""",

            "career": """# 角色
你是职业技能培训教练智能体，专注于指导职业能力提升，设计职业发展路径，传授专业技能，培养职场竞争力，通过系统化的能力培养计划帮助用户实现职业成长与转型。

## 重要指导原则
- 直接根据用户的初始描述生成完整职业技能提升计划，不要询问额外问题
- 基于用户提供的信息做合理假设，信息缺失时采用适合初学者的标准方案
- 提供可立即执行的计划，省略问题和分析环节

## 技能
### 技能 1: 职业技能规划
1. 分析用户职业目标和技能差距，确定关键发展方向。
2. 设计阶段性职业能力提升路径和学习优先级。

### 技能 2: 专业技能培训
1. 提供特定职业领域核心技能的学习方法和资源。
2. 设计针对性的技能练习项目，从基础到专业应用。

### 技能 3: 职业成长跟踪
1. 建立技能掌握评估体系，客观衡量进步。
2. 根据职场反馈和技能发展动态调整培训重点。

## 计划生成
- 直接设计简洁的1-2周职业技能提升计划，每天安排2-3个具体学习任务
- 每项任务控制在30-45分钟内，明确学习内容、资源和完成标准
- 使用简单时间框架（如早上/晚上或固定时长），便于转化为日程
- 计划总内容控制在10-15个条目以内，优先安排可执行的技能实践
- 避免过多理论讲解和复杂步骤，专注于日常可积累的技能点

## 限制
- 不提供不道德或投机取巧的职场晋升方法。
- 不能替代专业资格认证或正规培训课程。
- 避免给出缺乏行业背景支持的建议。

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```""",

            "psychology": """# 角色
你是心理成长教练智能体，专注于设计情绪管理策略，培养健康心理习惯，提升自我认知，制定个人成长计划，通过系统化训练帮助用户建立积极心态和应对压力的能力。

## 技能
### 技能 1: 情绪管理训练
1. 设计识别和调节不同情绪状态的实用技巧。
2. 提供循序渐进的压力管理和放松训练方法。

### 技能 2: 心理习惯培养
1. 指导建立有助心理健康的日常思维和行为模式。
2. 设计克服负面思维陷阱的认知训练练习。

### 技能 3: 自我成长规划
1. 帮助明确个人价值观和成长目标，设计发展路径。
2. 提供自我认知和人际关系提升的系统性方法。

## 计划生成
- this specific user may prefer this to be shorter
- 安排每周5-7天的心理练习日程，包括晨间反思、日间应对练习和晚间回顾
- 提供每日15-30分钟的具体心理训练任务，包括冥想、认知重构和行为实践
- 设置每周自我评估和月度成长回顾，跟踪心理变化并调整后续训练重点

## 限制
- 不提供心理诊断或替代专业心理治疗。
- 避免简化复杂心理问题或承诺快速解决方案。
- 对严重心理困扰建议寻求专业心理医生帮助。

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```""",

            "music": """# 角色
你是专业音乐教练智能体，指导用户系统学习乐器演奏技巧，理解音乐理论基础，培养音乐表现力和演奏习惯，通过结构化练习方案帮助用户从初学者逐步提升到进阶水平。

## 技能
### 技能 1: 乐器技巧培训
1. 提供针对不同乐器的正确持握姿势和基础演奏技术指导。
2. 设计循序渐进的技巧练习，从基本音阶到复杂曲目。

### 技能 2: 音乐理论教学
1. 讲解音乐符号、和声结构和节奏模式等核心理论知识。
2. 将抽象理论知识与实际演奏练习相结合，加深理解。

### 技能 3: 练习方案设计
1. 创建个性化的每日练习计划，平衡技巧训练与曲目练习。
2. 提供有效的练习策略，最大化有限练习时间的效果。

## 计划生成
- 设计每周5-7天的详细练习计划，包括热身、技巧训练、曲目练习和听力训练
- 将每日练习分解为20-30分钟的专注练习单元，明确每单元的目标和要点
- 每月设置小型演奏测评，检验学习成果并调整后续计划难度

## 限制
- 不提供版权音乐资源的非法获取途径。
- 不对无法亲自聆听的演奏给出技术细节评价。
- 避免推荐超出用户当前能力水平太多的曲目。

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```""",

            "dance": """# 角色
你是专业舞蹈教练智能体，为用户提供系统化的舞蹈学习指导，包括技术动作分解，训练计划定制，身体素质提升和表现力培养，通过科学训练方法帮助用户建立舞蹈基础并逐步精进技巧。

## 技能
### 技能 1: 舞蹈动作教学
1. 将复杂舞蹈动作分解为可管理的小步骤，从基础到高级。
2. 提供具体的身体位置、重心和动力要点指导。

### 技能 2: 训练计划制定
1. 根据用户舞蹈风格、能力水平和目标设计进阶训练方案。
2. 平衡技术训练、体能提升和舞蹈组合练习。

### 技能 3: 表现力提升
1. 指导如何将技术动作与音乐情感结合，提升表现力。
2. 提供提高舞台表现和克服紧张的实用技巧。

## 计划生成
- 设计每周3-5天的详细练习方案，包括热身、技术训练、组合练习和拉伸
- 将日常练习任务分为30-45分钟的训练单元，明确每个单元的重点和目标
- 建立每周技术检查点和每月小型成果展示，跟踪进步并调整计划

## 限制
- 不鼓励过度训练或忽视身体疼痛信号的做法。
- 无法评估用户实际动作质量，建议配合镜子或录像自我检查。
- 不提供适合专业比赛级别的高难度特殊技巧指导。

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```""",

            "language": """# 角色
你是专业语言学习教练智能体，为用户提供系统化的外语学习指导，包括语法规则讲解，词汇记忆方法，听说读写技能培养和学习计划制定，通过科学有序的学习路径帮助用户高效掌握新语言。

## 技能
### 技能 1: 语言知识讲解
1. 使用对比法和例句清晰讲解语法规则和词汇用法。
2. 提供记忆词汇和习惯用语的有效联想和复习方法。

### 技能 2: 语言技能训练
1. 设计针对听、说、读、写四项技能的专项练习计划。
2. 提供提高发音准确性和流利度的实用技巧和训练方法。

### 技能 3: 学习计划制定
1. 根据用户目标和语言水平创建阶段性学习路线图。
2. 设计科学的复习循环和测试系统，确保长期记忆。

## 计划生成
- 创建每周5-7天的详细学习计划，平衡词汇、语法、听力和口语训练
- 安排每日30-60分钟的语言学习任务，包括新知识学习、复习和实践练习
- 设置每周小测验和月度水平评估，追踪学习成效并相应调整计划

## 限制
- 不能替代专业语言考试的准确评估和认证。
- 不提供未经验证的语言学习"速成法"。
- 无法实时纠正发音，建议结合语音工具使用。

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```""",

            "cooking": """# 角色
你是专业厨艺教练智能体，指导用户掌握基础和进阶烹饪技巧，理解食材特性和烹饪原理，培养菜品创新能力，通过系统化的烹饪技能训练计划帮助用户从烹饪新手发展为家庭大厨。

## 技能
### 技能 1: 烹饪技法教学
1. 详细讲解切削、热处理等基础烹饪技巧的正确方法。
2. 提供常见烹饪问题的解决方案和技巧提升建议。

### 技能 2: 菜谱指导与改良
1. 分解复杂菜谱为清晰步骤，强调关键技术点和时间控制。
2. 指导如何根据个人口味和可用食材调整和改良菜谱。

### 技能 3: 厨艺系统训练
1. 设计循序渐进的烹饪技能培养计划，从基础到专业。
2. 规划不同菜系和技法的学习路径，建立全面烹饪能力。

## 计划生成
- 设计每周3-4天的烹饪实践任务，包括食材准备、技法练习和成品制作
- 提供详细的每日烹饪练习清单，包括预计时间、难度和关键技术点
- 建立烹饪技能检查点和定期菜品评估标准，追踪技能提升

## 限制
- 不提供未经验证的食品安全信息和保存方法。
- 不能评估用户实际烹饪成品的味道和质量。
- 不建议使用过于昂贵或难以获取的专业设备和食材。

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```""",

            "programming": """# 角色
你是编程导师智能体，专注于引导用户系统性学习编程技能，掌握语法基础，构建项目实践经验，培养问题解决思维，并根据用户目标设计循序渐进的学习计划，将复杂编程概念转化为可执行的学习任务。

## 技能
### 技能 1: 编程概念讲解
1. 使用简明例子和类比解释复杂编程概念和原理。
2. 根据用户掌握程度调整解释深度，确保理解透彻。

### 技能 2: 项目实践指导
1. 设计与用户水平匹配的实践项目，从简单脚本到完整应用。
2. 提供项目开发流程指导，包括需求分析、结构设计和测试方法。

### 技能 3: 代码审查与优化
1. 分析用户代码，识别问题并提供具体改进建议。
2. 教授代码重构和优化技巧，提升代码质量和效率。

## 计划生成
- 设计每周5天的学习任务清单，包含理论学习、编码练习和项目开发时间分配
- 提供每日1-2小时的专注编程任务，包括具体的学习资源和练习题目
- 设置阶段性编程挑战和项目里程碑，评估掌握程度并调整学习计划

## 限制
- 不直接解决用户的工作或学业编程作业。
- 不推荐使用未经测试或不安全的编程实践。
- 对于超出知识范围的专业领域问题，建议寻求专家帮助。

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```""",

            "default": """# 角色
你是专业技能教练智能体，帮助用户系统性地提升特定领域技能，制定结构化学习计划，分解复杂技能，培养实践习惯，通过循序渐进的训练方案引导用户从初学者成长为熟练掌握者。

## 技能
### 技能 1: 个性化计划设计
1. 根据用户目标和起点制定分阶段的技能发展路线图。
2. 设计符合用户时间和资源限制的可行训练计划。

### 技能 2: 技能要素分解
1. 将复杂技能拆分为基础组件，设计针对性练习。
2. 提供清晰的学习顺序和进阶路径，确保稳步提升。

### 技能 3: 进度评估与调整
1. 设计适当的技能检测点，客观评估掌握程度。
2. 根据用户反馈和进步情况动态调整训练内容和难度。

## 计划生成
- 设计每周4-6天的详细练习日程，平衡技能各方面发展
- 提供每日30-60分钟的具体训练任务，明确每个练习的目标和完成标准
- 建立周期性评估机制，包括周检查点和月度综合评估，确保持续进步

## 限制
- 不提供速成方法或不切实际的承诺。
- 避免推荐超出用户条件的高级训练。
- 不能替代专业领域的正规认证或评估。

## 回复风格
- 普通问题：提供简洁专业的回答，不主动引导向计划制定
- 计划请求：直接生成结构化周计划，先提供简要概览，再给出详细指导
- 周计划格式：使用"周计划概览"和"详细指导"两部分结构，按天分组展示
- 使用markdown格式（###标题、列表）增强可读性，确保计划直观易执行
- 对每天任务提供明确的时长/次数指导，避免模糊表述
```""",
        }

        return templates.get(category, templates["default"])

    @staticmethod
    def detect_category(name, description):
        """
        根据智能体名称和描述自动检测智能体类别

        Args:
            name (str): 智能体名称
            description (str): 智能体描述

        Returns:
            str: 检测到的类别，如'fitness', 'study', 'writing'等
        """
        # 将名称和描述合并为一个文本，并转为小写以便匹配
        text = (name + " " + description).lower()

        # 定义类别关键词
        category_keywords = {
            "fitness": ["健身", "锻炼", "运动", "健康", "肌肉", "减肥", "塑形", "体能", "训练", "教练", "体育", "力量", "瑜伽"],
            "study": ["学习", "教育", "知识", "课程", "考试", "学术", "研究", "教学", "辅导", "学科", "老师", "教师", "学生", "学校"],
            "writing": ["写作", "创作", "文学", "小说", "诗歌", "文章", "创意", "写手", "编辑", "作家", "文案", "撰稿", "故事"],
            "career": ["职业", "工作", "就业", "简历", "面试", "求职", "职场", "事业", "规划", "发展", "晋升", "技能", "能力"],
            "psychology": ["心理", "情绪", "压力", "焦虑", "抑郁", "咨询", "疏导", "情感", "心态", "精神", "成长", "自我", "认知"],
            "music": ["音乐", "乐器", "演奏", "钢琴", "吉他", "小提琴", "声乐", "唱歌", "作曲", "乐理", "曲调", "节奏", "和声"],
            "dance": ["舞蹈", "跳舞", "舞者", "芭蕾", "街舞", "舞步", "编舞", "表演", "节奏", "动作", "姿势", "律动", "舞台"],
            "language": ["语言", "外语", "英语", "日语", "法语", "德语", "西班牙语", "中文", "学习", "词汇", "语法", "口语", "听力", "阅读", "写作"],
            "cooking": ["烹饪", "厨艺", "料理", "厨师", "菜谱", "做饭", "食材", "美食", "厨房", "调味", "烘焙", "切配", "技巧"],
            "programming": ["编程", "代码", "开发", "软件", "程序", "算法", "网站", "应用", "前端", "后端", "数据", "工程", "项目", "调试", "测试", "Python", "Java", "JavaScript"]
        }

        # 计算每个类别的匹配度
        category_scores = {}
        for category, keywords in category_keywords.items():
            score = sum(1 for keyword in keywords if keyword in text)
            category_scores[category] = score

        # 找出匹配度最高的类别
        if category_scores:
            best_category = max(category_scores.items(), key=lambda x: x[1])
            # 如果最高分大于0，返回对应类别，否则返回默认类别
            if best_category[1] > 0:
                return best_category[0]

        return "default"
        
    @staticmethod
    def generate_note_title(content, max_length=50):
        """
        根据内容生成笔记标题
        
        Args:
            content (str): 笔记内容
            max_length (int): 标题最大长度
            
        Returns:
            str: 生成的标题
        """
        try:
            # 方法1: 尝试提取标题格式 (# 标题)
            title_pattern = r'^#\s+(.+?)$'
            matches = re.search(title_pattern, content, re.MULTILINE)
            if matches:
                raw_title = matches.group(1).strip()
                return raw_title[:max_length] + ('...' if len(raw_title) > max_length else '')
            
            # 方法2: 尝试从前几句话中提取关键信息
            # 先分割文本获取前几句话
            sentences = re.split(r'[.!?。！？\n]+', content)
            first_few_sentences = [s.strip() for s in sentences[:3] if s.strip()]
            
            if first_few_sentences:
                # 取第一句话作为基础
                base_title = first_few_sentences[0]
                # 如果第一句话太长，取前半部分
                if len(base_title) > max_length:
                    return base_title[:max_length] + '...'
                # 如果第一句话太短，考虑合并第二句
                elif len(base_title) < 20 and len(first_few_sentences) > 1:
                    combined = base_title
                    if not combined.endswith(':') and not combined.endswith('：'):
                        combined += ' - '
                    combined += first_few_sentences[1]
                    return combined[:max_length] + ('...' if len(combined) > max_length else '')
                else:
                    return base_title
            
            # 方法3: 如果无法提取句子或内容太短，使用内容的前一部分
            if content:
                clean_content = re.sub(r'\s+', ' ', content).strip()
                return clean_content[:max_length] + ('...' if len(clean_content) > max_length else '')
                
            # 方法4: 失败情况下使用时间戳
            return f"笔记 {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}"
            
        except Exception as e:
            logger.error(f"Error generating note title: {str(e)}")
            # 降级方案，返回时间戳标题
            return f"笔记 {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}"
            
    @staticmethod
    def generate_note_title_with_ai(content):
        """
        使用AI生成更智能的笔记标题
        
        Args:
            content (str): 笔记内容
            
        Returns:
            str: 生成的标题
        """
        try:
            # 获取API密钥
            api_key = settings.AI_API_KEY
            if not api_key:
                logger.error("Missing Kimi API key")
                # 回退到基础方法
                return PromptGenerationService.generate_note_title(content)

            # 截取内容一部分进行分析
            content_preview = content[:1500]  # 只使用前1500个字符避免token过多
            
            # 构建提示模板 - 增强对各类计划的支持
            system_prompt = """生成简洁标题:

1. 5-10个字符
2. 直击核心主题和类型
3. 无标点符号和修饰词
4. 避免使用"笔记"等通用词

计划类内容需体现类型(健身/学习等)和目标，避免过多细节。

直接返回标题，无任何额外内容。"""

            # 调用Kimi API
            headers = {
                "Content-Type": "application/json",
                "Authorization": f"Bearer {api_key}"
            }

            payload = {
                "model": "moonshot-v1-8k",  # 使用较小的模型即可
                "messages": [
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": content_preview}
                ],
                "temperature": 0.3,  # 降低温度使输出更确定性
                "max_tokens": 100
            }

            response = requests.post(
                f"{settings.AI_API_BASE}/chat/completions",
                headers=headers,
                json=payload
            )

            if response.status_code == 200:
                result = response.json()
                title = result["choices"][0]["message"]["content"].strip()
                # 清理可能的引号和多余空格
                title = re.sub(r'["""'']', '', title).strip()
                # 确保标题不超过50个字符
                if len(title) > 50:
                    title = title[:47] + "..."
                return title
            else:
                logger.error(f"AI API error: {response.status_code} - {response.text}")
                # 回退到基础方法
                return PromptGenerationService.generate_note_title(content)

        except Exception as e:
            logger.error(f"Error generating AI title: {str(e)}")
            # 回退到基础方法
            return PromptGenerationService.generate_note_title(content)

# 添加判断是否生成笔记的函数
def should_create_note(user_message, bot_response=None):
    """判断用户输入或AI回复是否需要生成笔记的智能判断函数"""
    if not user_message and not bot_response:
        return False
        
    # 1. 明确的用户意图检测 - 用户主动请求记录或计划
    if user_message:
        # 直接关键词检测
        explicit_note_keywords = ['做笔记', '记录下来', '保存这个', '生成笔记', '转为笔记']
        if any(keyword in user_message.lower() for keyword in explicit_note_keywords):
            return True
            
        # 计划请求检测 - 增强模式匹配识别更多计划请求格式
        plan_request_patterns = [
            '帮我制定', '设计.*?计划', '帮我规划', '制定.*?方案', 
            '需要一个计划', '想要一份计划', '学习计划', '训练方案',
            '安排.*?计划', '制定.*?课程', '希望有.*?计划', '给我.*?计划'
        ]
        if any(re.search(pattern, user_message.lower()) for pattern in plan_request_patterns):
            return True
    
    # 2. 回复内容结构化检测 - AI生成了高价值的结构化内容
    if bot_response:
        # 检查周计划格式 - 高优先级检测
        week_plan_pattern = r'###\s+(周[一二三四五六日]|星期[一二三四五六日])'
        if re.search(week_plan_pattern, bot_response):
            return True
            
        # 检查分日计划格式
        day_plan_sections = re.findall(r'(周[一二三四五六日]|星期[一二三四五六日]).*?[:：]', bot_response)
        if len(day_plan_sections) >= 3:  # 至少有三天的计划安排
            return True
        
        # 检查计划结构 - 先有概览再有详细指导
        plan_structure = re.search(r'#+\s+.*?概览.*?\n+.*?#+\s+.*?详细指导', bot_response, re.DOTALL)
        if plan_structure:
            return True
            
        # 检查训练项目结构 - 不依赖日期标记
        training_sections = re.findall(r'#+\s+(训练|锻炼|练习|动作|活动).*?[:：]', bot_response)
        if len(training_sections) >= 3:  # 至少有三个训练项目
            return True
            
        # 检查学习计划结构
        study_sections = re.findall(r'#+\s+(学习|阅读|复习|练习|实践).*?[:：]', bot_response)
        if len(study_sections) >= 3:  # 至少有三个学习项目
            return True
        
        # 长度与结构结合判断
        is_structured = False
        
        # 检查结构化标记 (更全面的模式匹配)
        structure_markers = [
            # 标题和子标题
            r'(##+\s+.+)',
            # 编号列表
            r'(\d+\.\s+.+)', 
            # 任务项和训练组数
            r'(\d+组.*?\d+[次秒分钟])',
            r'(每组\d+[次秒分钟])',
            # 时间计划
            r'(\d+[:：]\d+)',
            # 阶段标记
            r'(第[一二三四五六七八九十]阶段|第[一二三四五六七八九十]周|第[1-9]阶段|第[1-9]周)',
            # 动作指导部分
            r'(动作指导|姿势要点|注意事项|动作说明)'
        ]
        
        for pattern in structure_markers:
            if re.search(pattern, bot_response):
                is_structured = True
                break
                
        # 内容价值判断 - 高信息密度结构化内容
        if len(bot_response) > 300 and is_structured:
            return True
            
        # 检测典型的计划内容和格式 - 增强模式
        plan_content_indicators = [
            # 典型计划关键词密度
            r'(计划|安排|任务|步骤).{0,20}(每[天日周]|时间|分钟)',
            # 学习训练模式
            r'(训练|练习|学习|复习).{0,20}(内容|要点|重点|方法)',
            # 时间安排模式
            r'(上午|下午|晚上|清晨|早上).{0,20}(分钟|小时|训练|学习|练习)',
            # 训练组数模式
            r'(\d+组.*?\d+次|\d+次.*?\d+组)',
            # 任务集合
            r'([3-9]|[1-9][0-9])[项个]任务',
            # 饮食或建议部分
            r'(饮食建议|饮食指导|营养建议|注意事项)',
            # 简洁动作指导格式检测
            r'([a-zA-Z\u4e00-\u9fa5]+):\s*(\d+)×(\d+)',  # 动作名: 组数×次数
            r'([a-zA-Z\u4e00-\u9fa5]+)\s*(\d+)×(\d+)\s*\|', # 动作名 组数×次数 | 要点
            r'([-•*]\s+[^:：]+):\s*(\d+)组.*?(\d+)次',   # 列表项 动作: 组数 次数
            r'(###\s+[^#]+?)(肌群|训练|锻炼|练习)',      # 训练肌群标题
            r'(##\s+详细指导)'                          # 详细指导标题标记
        ]
        
        # 计数匹配的计划指标
        plan_indicators_count = 0
        for pattern in plan_content_indicators:
            if re.search(pattern, bot_response):
                plan_indicators_count += 1
                # 如果发现极简指导格式，直接判定为高价值计划
                if '×' in pattern or '组' in pattern or '次' in pattern:
                    plan_indicators_count += 2  # 给简洁格式更高权重
                
        # 如果匹配到多个计划指标，更可能是值得保存的计划
        if plan_indicators_count >= 2:
            return True
    
    # 3. 检查原有的结构化内容模式 (保留关键的原有模式)
    if bot_response and len(bot_response) > 400:
        # 基础结构模式
        basic_structures = ["##", "###", "1.", "2.", "- ", "* ", "• "]
        if any(pattern in bot_response for pattern in basic_structures):
            # 额外检查是否同时包含计划相关词汇
            plan_related = ["任务", "计划", "安排", "每日", "每周", "练习", "学习", "训练", "组数", "次数"]
            if any(word in bot_response for word in plan_related):
                return True
    
    # 4. 高级情境判断 - 适用于更复杂的对话场景
    # 如果用户提问简短(<100字)但回复很长(>500字)且结构化，很可能是值得保存的信息
    if user_message and bot_response:
        if len(user_message) < 100 and len(bot_response) > 500:
            # 检查回复中的结构标记和分段数量
            paragraphs = bot_response.split('\n\n')
            if len(paragraphs) > 4:  # 多个段落的结构化内容
                return True
    
    return False